package com.mingyuean.demo.spring.factory.support;

import com.mingyuean.demo.spring.BeanException;
import com.mingyuean.demo.spring.factory.config.BeanDefinition;

/**
 * @author MingYueAn
 * <p>  具有自动布线能力的Bean工厂
 * <p>  2023/3/19 16:22
 * @version: 1.0
 */
public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFactory {
    /**
     * 重写AbstractBeanFactory中的createBean(), 实现自动装配并创建bean实例
     * @param beanName bean名称
     * @param beanDefinition 对应的bean信息
     * @return bean实例
     */
    @Override
    protected Object createBean(String beanName, BeanDefinition beanDefinition) {
        // 新建一个newInstance变量，用于存储创建的bean实例
        Object newInstance = null;
        try {
            // 通过反射机制创建bean实例对象
            newInstance = beanDefinition.getBean().newInstance();
        } catch (InstantiationException | IllegalAccessException e) {
            // 抛出BeanException异常，说明实例化bean失败
            throw new BeanException("实例化bean失败", e);
        }
        // 将创建的bean实例注册到singletonMap中
        registrySingleton(beanName, newInstance);
        // 返回创建的bean实例对象
        return newInstance;
    }
}
